package org.grey;

import org.grey.edz.ConverterEnum;
import org.grey.edz.EasyDZipperProcessor;
import org.grey.edz.IDZipperProcessor;

import java.util.Optional;

/**
 * @program: easy-data-zipper
 * @ClassName EasyDZipper
 * @description: 对外API入口
 * 对外提供的api唯一调度入口，通过EasyDZipperBuilder构建
 * todo：1、本类不应该交给容器保管
 * todo：2、可以增加工厂管理已经创建好的EasyDZipper，避免重复创建，工厂也可以交给外部自己定义。
 * todo：3、面对复合场景需求，之后需调整为责任链模式
 * @author: Grey
 * @create: 2024-01-09 17:17
 */
public class EasyDZipper {

    private IDZipperProcessor dZipperProcessor;

    public EasyDZipper(ConverterEnum converterEnum) {
        //todo IDZipperProcessor init 这里需要完成EasyDZipper工作所需要的所有组件的注册。
        init(converterEnum);
    }
    private void init(ConverterEnum converterEnum){
        // init ruleParser
        // init converter
        // 此处只注入默认的，之后可以使用配置器去定制替换
        this.dZipperProcessor = new EasyDZipperProcessor(source -> source==null , converterEnum.converter);


        // init payload
    }

    //留待适配容器框架
    public EasyDZipper(IDZipperProcessor dZipperProcessor) {
        this.dZipperProcessor = dZipperProcessor;
    }

    /**
     * @description 可链化断言
     * @date 19/2/2024 5:55 下午
     * @author Grey
     */
    public boolean zipperPredicate(Object source){
        return dZipperProcessor.predicate(source);
    }

    /**
     * @description 链化
     * @date 19/2/2024 5:55 下午
     * @author Grey
     */
    public Optional<Object> doZipper(Object source){
        return doZipper(source,dZipperProcessor.defaultConverterEnum());
    }

    public Optional<Object> doZipper(Object source, ConverterEnum converterEmum){
        if(!zipperPredicate(source))
            return Optional.empty();
        return Optional.ofNullable(dZipperProcessor.doZipper(source,converterEmum));
    }

}
